package com.idroc.storage;

import java.nio.ByteBuffer;

/**
 * IO最小读写同步单位: IO块
 * @author yuyoo (yuyoo4j@163.com)
 *
 */
public interface IoBlock {

	/**
	 * 获取IO块在IO文件中的偏移
	 * @return -- 偏移值
	 */
	long getOffset();
	
	/**
	 * IO块大小
	 * @return -- IO块大小值
	 */
	int size();
	
	/**
	 * 获取IO块的数据
	 * @return -- 数据对象
	 */
	byte[] array();
	
	/**
	 * IO块在数组中的偏移位置
	 * @return -- 偏移
	 */
	int arrayOffset();
	
	/**
	 * 将字节数组的部分数据包装成一个IO块
	 * @param data -- 被包装的字节数组
	 * @param offset -- 开始包装的位置在数组中的偏移 
	 */
	void wrap(byte[] data, int offset);
	
	/**
	 * 将IO块中的数据同步到IO文件
	 * @return -- true, 同步成功
	 */
	boolean sync();
	
	/**
	 * 从IO文件中加载数据
	 * @return -- true, 加载成功
	 */
	boolean load();
	
	/**
	 * 数据是否被修改过
	 * @return -- true, 已是脏数据(某些字节被修改过)
	 */
	boolean isDirty();
	
	/**
	 * 在IO块中某个位置写一个字节
	 * @param pos -- IO块中的偏移
	 * @param value -- 字节数据
	 */
	void write(int pos, byte value);
	
	/**
	 * 在IO块中写一个short
	 * @param pos -- IO块中的偏移
	 * @param value -- short数据
	 */
	void writeShort(int pos, short value);
	
	/**
	 * 在IO块中写一个int
	 * @param pos -- IO块中的偏移
	 * @param value -- int数据
	 */
	void writeInt(int pos, int value);
	
	/**
	 * 在IO块中写一个long
	 * @param pos -- IO块中的偏移
	 * @param value -- long数据
	 */
	void writeLong(int pos, long value);
	
	/**
	 * 在IO块中写一个字节数组
	 * @param pos -- IO块中的偏移
	 * @param values -- 字节数组
	 */
	void write(int pos, byte[] values);
	
	/**
	 * 在IO块中读取一个字节
	 * @param pos -- IO块中的偏移
	 * @return -- 字节数据
	 */
	byte read(int pos);
	
	/**
	 * 在IO块中读取一个short
	 * @param pos -- IO块中的偏移
	 * @return -- short数据
	 */
	short readShort(int pos);
	
	/**
	 * 在IO块中读取一个int
	 * @param pos -- IO块中的偏移
	 * @return -- int数据
	 */
	int readInt(int pos);
	
	/**
	 * 在IO块中读取一个long
	 * @param pos -- IO块中的偏移
	 * @return -- long数据
	 */
	long readLong(int pos);
	
	/**
	 * 在IO块中读出一个字节数组
	 * @param pos -- IO块中的偏移
	 * @param length -- 读取长度
	 * @return
	 */
	byte[] readBytes(int pos, int length);
	
	/**
	 * 获取IoBlockFile
	 * @return -- 文件对象
	 */
	IoBlockFile getIoBlockFile();
}
